package com.mmy.service.impl.line;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.mmy.controller.Common;
import com.mmy.controller.UtilConstants;
import com.mmy.dao.line.TLineOrderRepository;
import com.mmy.dao.line.TLinePlanRepository;
import com.mmy.dao.line.VLineOrderRepository;
import com.mmy.dao.line.VLinePlanRepository;
import com.mmy.domain.line.TLineOrder;
import com.mmy.domain.line.TLinePlan;
import com.mmy.domain.line.VLineOrder;
import com.mmy.domain.line.VLinePlan;
import com.mmy.domain.sys.TSysUser;
import com.mmy.service.ServiceCommon;

@Service
public class LineOrderServiceImpl /* implements LineOrderService */ {
	@Autowired
	private TLineOrderRepository tLineOrderRepository;
	@Autowired
	private VLineOrderRepository vLineOrderRepository;
	@Autowired
	private ServiceCommon serviceCommon;
	@Autowired
	private VLinePlanRepository vLinePlanRepository;
	@Autowired
	private TLinePlanRepository tLinePlanRepository;

	/**
	 * 个人中心通过登录人获取线路预留 获取分页
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public HashMap<String, Integer> mapLineReserve(String pageNumber, String pageSize, int iUserID) {
		Common common = new Common();
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		mapPage = common.getPage(pageNumber, pageSize, tLineOrderRepository.countByUserID(iUserID));
		return mapPage;
	}

	/**
	 * 个人中心通过登录人获取线路退单 获取分页
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public HashMap<String, Integer> mapLineRefund(String pageNumber, String pageSize, int iUserID) {
		Common common = new Common();
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		mapPage = common.getPage(pageNumber, pageSize, tLineOrderRepository.countByRefundUserID(iUserID));
		return mapPage;
	}

	/**
	 * 个人中心通过登录人获取线路订单 获取分页
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public HashMap<String, Integer> mapLineOrder(String pageNumber, String pageSize, int iUserID) {
		Common common = new Common();
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		mapPage = common.getPage(pageNumber, pageSize, tLineOrderRepository.countByOrderUserID(iUserID));
		return mapPage;
	}

	/**
	 * 个人中心通过登录人获取线路预留
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public List<TLineOrder> findByUserID(String pageNumber, String pageSize, int iUserID) {
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		List<TLineOrder> lstLineOrder = tLineOrderRepository.findByUserID(iUserID, iTempPageNo, iPageSize);
		return lstLineOrder;
	}

	/**
	 * 个人中心通过登录人获取线路订单
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public List<TLineOrder> findByOrderUserID(String pageNumber, String pageSize, int iUserID) {
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		List<TLineOrder> lstLineOrder = new ArrayList<TLineOrder>();
		lstLineOrder = tLineOrderRepository.findByOrderUserID(iUserID, iTempPageNo, iPageSize);
		return lstLineOrder;
	}

	/**
	 * 个人中心通过登录人获取线路退单
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public List<TLineOrder> findByChargeBackUserID(String pageNumber, String pageSize, int iUserID) {
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		List<TLineOrder> lstLineOrder = new ArrayList<TLineOrder>();
		lstLineOrder = tLineOrderRepository.findByChargeBackUserID(iUserID, iTempPageNo, iPageSize);
		return lstLineOrder;
	}

	/**
	 * 个人中心通过登录人取消线路预留
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public void updateState(int iID, TSysUser sessionSysUser) {

		TLineOrder dbLineOrder = tLineOrderRepository.findByID(iID);
		dbLineOrder.setOrderState((byte) 3);
		dbLineOrder.setModifyDate(new Date());
		dbLineOrder.setReviser(sessionSysUser.getUserName());
		tLineOrderRepository.save(dbLineOrder);
	}

	/**
	 * 个人中心通过登录人申请线路退单
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public void updateRefundState(int iID, TSysUser sessionSysUser) {

		TLineOrder dbLineOrder = tLineOrderRepository.findByID(iID);
		dbLineOrder.setOrderState((byte) 4);
		dbLineOrder.setRefundProcess((byte) 1);
		dbLineOrder.setModifyDate(new Date());
		dbLineOrder.setReviser(sessionSysUser.getUserName());
		tLineOrderRepository.save(dbLineOrder);
	}

	/**
	 * 个人中心通过登录人点击撤销线路退单
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public void updateCancelState(int iID, TSysUser sessionSysUser) {

		TLineOrder dbLineOrder = tLineOrderRepository.findByID(iID);
		dbLineOrder.setOrderState((byte) 2);
		dbLineOrder.setRefundProcess((byte) 0);
		dbLineOrder.setModifyDate(new Date());
		dbLineOrder.setReviser(sessionSysUser.getUserName());
		tLineOrderRepository.save(dbLineOrder);
	}

	/**
	 * 通过订单ID查询
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public TLineOrder findByID(int iID) {

		return tLineOrderRepository.findByID(iID);
	}

	/**
	 * 通过订单ID查询v
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public VLineOrder findVByID(int iID) {

		return vLineOrderRepository.findVByID(iID);
	}

	/**
	 * 函数功能说明： 根据预留姓名、时间查询 订单组
	 *
	 * @param 参数说明
	 * @return 返回值说明 vLineOrder
	 * @throws 异常处理说明
	 * @author 创建人liys
	 * @date 创建日期 修改时间 2021.01.12
	 */
	public List<VLineOrder> searchReserveGroup(String strReserveName, Date reserveDate, int iType) {

		return vLineOrderRepository.searchReserveGroup(strReserveName, reserveDate, iType);
	}

	/**
	 * 获取最大流水号
	 * 
	 * @return 返回值说明 流水号
	 * @author 创建人 hanxl
	 * @date 创建日期 2020.10.29
	 * @reviser 修改人 dingxd
	 * @date 创建日期 2020.11.16
	 */
	public int getMaxID() {
		// 流水号
		Object objCode = tLineOrderRepository.getMaxID();
		int iID = 0;
		if (objCode != null) {
			iID = Integer.parseInt(objCode.toString());
		}
		return iID;
	}

	/**
	 * 获取订单最大编码
	 * 
	 * @param 参数说明 计划单编码
	 * @return 返回值说明 订单编码
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.14
	 */
	public String getMaxCode(int iPlanID) {
		// int 转 string
		String strPlanID = String.valueOf(iPlanID);
		// 返回订单最大编码
		Object objCode = tLineOrderRepository.getMaxCode(strPlanID);
		String strCode = "";
		if (objCode != null) {
			strCode = objCode.toString();
		}
		return strCode;
	}

	/**
	 * 函数功能说明：新增id
	 *
	 * @param 参数说明
	 * @return 返回值说明 无返回值
	 * @throws 异常处理说明
	 * @author 创建人 hanxl 修改人 shangzl
	 * @date 创建日期 修改时间 2020.11.18
	 */
	public void save(int id) {

		tLineOrderRepository.save(id);
	}

	/**
	 * 函数功能说明：新增订单
	 *
	 * @param 参数说明
	 * @return 返回值说明 无返回值
	 * @throws 异常处理说明
	 * @author 创建人 hanxl 修改人 shangzl
	 * @date 创建日期 修改时间 2020.11.18
	 */
	public void save(TLineOrder tLineOrder) {

		tLineOrderRepository.save(tLineOrder);
	}

	/**
	 * 函数功能说明：查找线路的订单
	 *
	 * @param 参数说明
	 * @return 返回值说明 线路订单集合
	 * @throws 异常处理说明
	 * @author 创建人 hanxl 修改人 shangzl 修改人liys
	 * @date 创建日期 修改时间 2020.11.18 修改时间 2020.12.25
	 */
	public List<VLineOrder> findByLineID(int iLineID) {

		return vLineOrderRepository.findByLineID(iLineID);
	}

	/**
	 * 函数功能说明：删除预留
	 *
	 * @param 参数说明
	 * @return 返回值说明 无返回值
	 * @throws 异常处理说明
	 * @author 创建人 hanxl 修改人 shangzl
	 * @date 创建日期 修改时间 2020.11.18
	 */
	public void delLineOrder(List<Integer> lstID) {

		tLineOrderRepository.delLineOrder(lstID);
	}

	/**
	 * 函数功能说明： 出纳查询
	 *
	 * @param 参数说明
	 * @return 返回值说明 线路订单集合
	 * @throws 异常处理说明
	 * @author 创建人 hanxl 修改人 shangzl
	 * @date 创建日期 修改时间 2020.11.18
	 */
	public List<TLineOrder> findByCashierAndLineID(String strCashierState, int iLineID) {

		return tLineOrderRepository.findByCashierAndLineID(strCashierState, iLineID);
	}

	/**
	 * 函数功能说明： 查询全部
	 *
	 * @param 参数说明
	 * @return 返回值说明 线路订单集合
	 * @throws 异常处理说明
	 * @author 创建人 hanxl 修改人 shangzl
	 * @date 创建日期 修改时间 2020.11.18
	 */
	public List<VLineOrder> findAll() {

		return vLineOrderRepository.findAll();
	}

	/**
	 * 函数功能说明： 预留单
	 *
	 * @param 参数说明
	 * @return 返回值说明 线路订单集合
	 * @throws 异常处理说明
	 * @author 创建人liys
	 * @date 创建日期 修改时间 2021.01.25
	 */
	public List<VLineOrder> reserved(TSysUser tSysUser, String orderType, String lineName, String strReserveName,
			String strReserveTel, String strReserveDay, String pageNumber, String pageSize, int iType) {
		Integer iOrgID = tSysUser.getOrgID();
		String Org1 = "";
		String Org2 = "";
		String Org3 = "";
		if (orderType == null)
			orderType = "0";
		switch (orderType) {
		case "0":
			Org1 = "";
			Org2 = "";
			Org3 = "";
			break;
		case "1":
			Org1 = iOrgID.toString();
			Org2 = "";
			Org3 = "";
			break;
		case "2":
			Org1 = "";
			Org2 = iOrgID.toString();
			Org3 = "";
			break;
		case "3":
			Org1 = "";
			Org2 = "";
			Org3 = iOrgID.toString();
			break;
		default:
			Org1 = "";
			Org2 = "";
			Org3 = "";
		}
		if (lineName == null)
			lineName = "";
		if (strReserveName == null)
			strReserveName = "";
		if (strReserveTel == null)
			strReserveTel = "";
		if (strReserveDay == null)
			strReserveDay = "";
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null)
			pageNumber = "1";
		if (pageSize == null)
			iPageSize = 10;
		else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		return vLineOrderRepository.reserved(Org1, Org2, Org3, iOrgID, lineName, strReserveName, strReserveTel,
				strReserveDay, iTempPageNo, iPageSize, iType);
	}

	/**
	 * 函数功能说明： 订单
	 *
	 * @param 参数说明
	 * @return 返回值说明 线路订单集合
	 * @throws 异常处理说明
	 * @author 创建人liys
	 * @date 创建日期 修改时间 2021.01.25
	 */
	public List<VLineOrder> paid(TSysUser tSysUser, String orderType, String lineName, String strOrderName,
			String strOrderTel, String strOrderDay, String pageNumber, String pageSize, int iType) {

		Integer iOrgID = tSysUser.getOrgID();
		String Org1 = "";
		String Org2 = "";
		String Org3 = "";
		if (orderType == null)
			orderType = "0";
		switch (orderType) {
		case "0":
			// 全部
			Org1 = "";
			Org2 = "";
			Org3 = "";
			break;
		case "1":
			// 本公
			Org1 = iOrgID.toString();
			Org2 = "";
			Org3 = "";
			break;
		case "2":
			// 采购
			Org1 = "";
			Org2 = iOrgID.toString();
			Org3 = "";
			break;
		case "3":
			// 外采
			Org1 = "";
			Org2 = "";
			Org3 = iOrgID.toString();
			break;
		default:
			Org1 = "";
			Org2 = "";
			Org3 = "";
		}
		if (lineName == null)
			lineName = "";
		if (strOrderName == null)
			strOrderName = "";
		if (strOrderTel == null)
			strOrderTel = "";
		if (strOrderDay == null)
			strOrderDay = "";
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null)
			pageNumber = "1";
		if (pageSize == null)
			iPageSize = 10;
		else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		return vLineOrderRepository.paid(Org1, Org2, Org3, iOrgID, lineName, strOrderName, strOrderTel, strOrderDay,
				iTempPageNo, iPageSize, iType);
	}

	/**
	 * 函数功能说明： 退单
	 *
	 * @param 参数说明
	 * @return 返回值说明 线路订单集合
	 * @throws 异常处理说明
	 * @author 创建人liys
	 * @date 创建日期 修改时间 2021.01.25
	 */
	public List<VLineOrder> cancel(TSysUser tSysUser, String orderType, String lineName, String strOrderName,
			String strOrderTel, String strOrderDay, String pageNumber, String pageSize, int iType) {

		Integer iOrgID = tSysUser.getOrgID();
		String Org1 = "";
		String Org2 = "";
		String Org3 = "";
		if (orderType == null)
			orderType = "0";
		switch (orderType) {
		case "0":
			// 全部
			Org1 = "";
			Org2 = "";
			Org3 = "";
			break;
		case "1":
			// 本公
			Org1 = iOrgID.toString();
			Org2 = "";
			Org3 = "";
			break;
		case "2":
			// 采购
			Org1 = "";
			Org2 = iOrgID.toString();
			Org3 = "";
			break;
		case "3":
			// 外采
			Org1 = "";
			Org2 = "";
			Org3 = iOrgID.toString();
			break;
		default:
			Org1 = "";
			Org2 = "";
			Org3 = "";
		}
		if (lineName == null)
			lineName = "";
		if (strOrderName == null)
			strOrderName = "";
		if (strOrderTel == null)
			strOrderTel = "";
		if (strOrderDay == null)
			strOrderDay = "";
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null)
			pageNumber = "1";
		if (pageSize == null)
			iPageSize = 10;
		else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		return vLineOrderRepository.cancel(Org1, Org2, Org3, iOrgID, lineName, strOrderName, strOrderTel, strOrderDay,
				iTempPageNo, iPageSize, iType);
	}

	/**
	 * 函数功能说明： 分页参数-预留
	 *
	 * @param 参数说明
	 * @return 返回值说明 分页数据
	 * @throws 异常处理说明
	 * @author 创建人liys
	 * @date 创建日期 2021.01.25
	 */
	public Map<String, Integer> reservedPage(int iOrgID, String pageNumber, String pageSize, int iType) {

		Map<String, Integer> mapPage = new HashMap<>();
		mapPage = serviceCommon.getPage(pageNumber, pageSize, vLineOrderRepository.reservedCount(iOrgID, iType));
		return mapPage;
	}

	/**
	 * 函数功能说明： 分页参数-订单
	 *
	 * @param 参数说明
	 * @return 返回值说明 分页数据
	 * @throws 异常处理说明
	 * @author 创建人liys
	 * @date 创建日期 2021.01.18
	 */
	public Map<String, Integer> paidPage(int iOrgID, String pageNumber, String pageSize, int iType) {

		Map<String, Integer> mapPage = new HashMap<>();
		mapPage = serviceCommon.getPage(pageNumber, pageSize, vLineOrderRepository.paidCount(iOrgID, iType));
		return mapPage;
	}

	/**
	 * 函数功能说明： 分页参数-退单
	 *
	 * @param 参数说明
	 * @return 返回值说明 分页数据
	 * @throws 异常处理说明
	 * @author 创建人liys
	 * @date 创建日期 2021.01.18
	 */
	public Map<String, Integer> cancelPage(int iOrgID, String pageNumber, String pageSize, int iType) {

		Map<String, Integer> mapPage = new HashMap<>();
		mapPage = serviceCommon.getPage(pageNumber, pageSize, vLineOrderRepository.cancelCount(iOrgID, iType));
		return mapPage;
	}

	/**
	 * 函数功能说明： 会计查询
	 *
	 * @param 参数说明
	 * @return 返回值说明 线路订单集合
	 * @throws 异常处理说明
	 * @author 创建人 hanxl 修改人 shangzl
	 * @date 创建日期 修改时间 2020.11.18
	 */
	public List<TLineOrder> findByAccountAndLineID(String strAccountState, int iLineID) {

		return tLineOrderRepository.findByAccountAndLineID(strAccountState, iLineID);
	}

	/**
	 * 函数功能说明： 批量保存出纳审核
	 *
	 * @param 参数说明
	 * @return 返回值说明 无返回值
	 * @throws 异常处理说明
	 * @author 创建人 hanxl 修改人 shangzl
	 * @date 创建日期 修改时间 2020.11.18
	 */
	public void saveAll(List<TLineOrder> lstCashier) {

		tLineOrderRepository.saveAll(lstCashier);
	}

	/**
	 * 函数功能说明： 新建线路预留信息
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人 shangzl 修改人liys
	 * @date 创建日期 修改日期 2020.1.7
	 */
	public void saveReserveLine(TLineOrder tLineOrder, TSysUser tSysUser, Integer iPlanID, Date date,Integer lineID) {
		
		VLinePlan vLinePlan = vLinePlanRepository.findByPlanID(iPlanID);
		tLineOrder.setID(serviceCommon.createMaxID(UtilConstants.TableName.T_LINE_ORDER));
		String cOrderID = serviceCommon.orderCode(UtilConstants.TableName.T_LINE_ORDER,lineID,date,iPlanID);
		tLineOrder.setReserveUserID(tSysUser.getUserID());
		tLineOrder.setReserveDate(date);
		tLineOrder.setCreateDate(date);
		tLineOrder.setFloor(vLinePlan.getFloor());
		tLineOrder.setPeer(vLinePlan.getPeer());
		tLineOrder.setPrice(vLinePlan.getPrice());
		tLineOrder.setCreator(tSysUser.getUserName());
		tLineOrder.setOrderID(cOrderID);
		tLineOrderRepository.save(tLineOrder.getID());
		tLineOrder.setOrderState((byte) 0);
		tLineOrder.setCashierState((byte) 0);
		tLineOrder.setAccountState((byte) 0);
		tLineOrder.setInvoiceState((byte) 0);
		tLineOrder.setRefundState((byte) 0);
		tLineOrder.setRemittanceState((byte) 0);
		tLineOrderRepository.save(tLineOrder);
		TLinePlan tLinePlan = tLinePlanRepository.findByPlanID(iPlanID);
		tLinePlan.setNumber(tLinePlan.getNumber() - 1);
		tLinePlanRepository.save(tLinePlan);
	}

	/**
	 * 函数功能说明： 根据预留单获取标准集合
	 *
	 * @param 参数说明
	 * @return 返回值说明
	 * @throws 异常处理说明
	 * @author 创建人 shangzl 修改人liys
	 * @date 创建日期 修改日期 2020.1.7
	 */
	public List<Map<String, Object>> findPlanIdName(List<VLineOrder> lstLineOrder) {

		List<Map<String, Object>> lstPlanIdName = new ArrayList<Map<String, Object>>();
		for (VLineOrder vLineOrder : lstLineOrder) {
			Integer iPlanID = vLineOrder.getPlanID();
			VLinePlan vLinePlan = vLinePlanRepository.findByPlanID(iPlanID);
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("ID", vLineOrder.getID());
			map.put("planID", iPlanID);
			map.put("planName", vLinePlan.getStandard());
			lstPlanIdName.add(map);
		}
		return lstPlanIdName;
	}

	/**
	 * 函数功能说明： 提交--转订单
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @throws 异常处理说明
	 * @author 创建人 liys
	 * @date 创建日期 修改日期 2020.1.7
	 */
	public void savePayOrderLine(List<VLineOrder> lstLineOrder, TSysUser tSysUser) {

		for (VLineOrder vLineOrderTemp : lstLineOrder) {
			TLineOrder newLineOrder = tLineOrderRepository.findByID(vLineOrderTemp.getID());
			newLineOrder.setOrderName(vLineOrderTemp.getOrderName());
			newLineOrder.setOrderTel(vLineOrderTemp.getOrderTel());
			newLineOrder.setIdentity(vLineOrderTemp.getIdentity());
			newLineOrder.setOrderUserID(tSysUser.getUserID());
			newLineOrder.setOrderDate(new Date());
			newLineOrder.setOrderState((byte) 2);
			newLineOrder.setReceivable(vLineOrderTemp.getReceivable());
			newLineOrder.setReceipt(vLineOrderTemp.getReceipt());
			newLineOrder.setPayType(vLineOrderTemp.getPayType());
			newLineOrder.setVoucher(vLineOrderTemp.getVoucher());
			tLineOrderRepository.save(newLineOrder);
		}
	}

}
